/**
 * @file usr_i2c.c
 * @author 黑马小乌龟 (532352406@qq.com)
 * @brief 
 * @version 0.1
 * @date 2025-10-11
 * 
 * @copyright Copyright (c) 2025
 * 
 */
/********************************** (C) COPYRIGHT *******************************
* File Name          : I2C_SLAVE.C
* Author             : WCH
* Version            : V1.0
* Date               : 2022/01/13
* Description        : CH543 I2C Slave 中断例程

主机发送:支持多字节发送数据,时序等同于24CXX系列Page Write,数据地址起始地址0x00
        START + 器件地址(0x56) + 数据地址(0x00) + 数据*(N) + STOP

主机读取:支持多字节读取数据，时序等同于24CXX系列Random Read,数据地址起始地址为0x00
        START + 器件地址(0x56) + 数据地址(0x00) + START + 器件地址(0x57) + 数据*(N) + STOP
  SCL  ->  P3.0
  SDA  ->  P3.1
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
********************************************************************************/

/******************************************************************************/
/* 头文件包含 */
#include "CH543.H"
#include "DEBUG.H"
#include "system.h"


#pragma  NOAREGS

/******************************************************************************/
/* 常、变量定义 */


UINT8X i2cs_reg_map[ MAX_I2C_SLAVE_REG ] = { SW_VERSION,0x00, INPUT_CFG_DEFAULT};
BOOL i2cs_flag = 0,i2cs_recv_flag = 0;
/*50mV*/
const UINT16 out_cfg_table[USB_IN_CFG_MAX]={
    5000ul/50,
    9000ul/50,
    12000ul/50,
    15000ul/50,
    20000ul/50
};

const UINT16 out_cfg_table_for_QC[USB_IN_CFG_MAX]={
    WORK_M_QC_REQ_SUCCCESS,
    WORK_M_WAIT_QC_REQ_9V,
    WORK_M_WAIT_QC_REQ_12V,
    WORK_M_WAIT_QC_REQ_12V,
    WORK_M_WAIT_QC_REQ_20V,
};


UINT8 get_out_cfg(void){
    return (i2cs_reg_map[2]&0x0f);
}
/*******************************************************************************
* Function Name  : I2CS_Slave_Init
* Description    : 硬件I2CS初始化函数
* Input          : None
* Return         : None
*******************************************************************************/
void I2CS_Slave_Init(void) {
    UINT8 i;

    P3_MOD_OC |= 0x03; /* 开漏输出 */
    P3_DIR_PU |= 0x03; /* 使能上拉 */
    I2CS_DEV_A = I2C_SLAVE_DEV_ADD; /* 从机设备地址 */
    I2CS_CTRL = bI2CS_IE_READ | bI2CS_IE_WRITE | bI2CS_IE_ADDR | bI2CS_IE_STASTO | bI2CS_EN;
    IE_I2C = 1;
}

/*******************************************************************************
* Function Name  : I2C_INT( )
* Description    : IIC 中断服务函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_INT(void) interrupt INT_NO_I2C using 1 {
    UINT8 tmp;
//     [3:0] MASK_I2CS_STAT RO 
// I2CS从机当前状态： 
// 0000-空闲或者正在接收从机地址； 
// 0001-对接收到的从机地址进行应答； 
// 0010-正在接收数据单元地址； 
// 0011-对接收到的数据单元地址进行应答； 
// 0100-正在接收数据字节； 
// 0101-对接收到的数据字节进行应答； 
// 0110-正在发送数据字节； 
// 0111-正在等待和检查发送数据后的应答； 
    if (I2CS_STAT & bI2CS_IF_DEV_A) {
        i2cs_flag = 0;
        i2cs_recv_flag = 0;
    }
    if ((I2CS_STAT & MASK_I2CS_STAT) == 3 || (I2CS_STAT & MASK_I2CS_STAT) == 7){ /* 接收到数据单元地址 */
        if(I2CS_ADDR<MAX_I2C_SLAVE_REG){
            I2CS_DATA = i2cs_reg_map[I2CS_ADDR];
            P3_2 = 1;
        }else{
            I2CS_DATA = 0x00;
        }
    } else if ((I2CS_STAT & MASK_I2CS_STAT) == 5){ /* 接收到数据字节 */
        if(I2CS_ADDR<MAX_I2C_SLAVE_REG && I2CS_ADDR > 1){
            i2cs_reg_map[I2CS_ADDR] = I2CS_DATA;
            i2cs_recv_flag = 1;
        }else{
            tmp = I2CS_DATA;
        }
    } else if ((I2CS_STAT & MASK_I2CS_STAT) == 0x0C){ /*接收到stop 一次传输完成*/
        i2cs_flag = 1;
    }
    I2CS_STAT |= 0xF0; /* 清I2CS中断 */
}

